﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace 时钟壁纸应用.主要窗口
{
    class 配置文件
    {
        public string 配置文件位置 { get; set; }
    }
    class 铃声信息
    {
        public string 曲名 { get; set; }
        public string 铃声文件名 { get; set; }
        public string 铃声文件组 { get; set; }
        public string 铃声路径 { get; set; }
    }
    /// <summary>
    /// 配置设置.xaml 的交互逻辑
    /// </summary>
    public partial class 配置设置 : Window
    {
        #region 初始化类
        配置文件 配置 = new 配置文件();
        用户设置 设置 = new 用户设置();
        时间区间 时间区间;
        List<铃声信息> 铃声组 = new List<铃声信息>();
        List<string> 文件组 = new List<string>();
 
        #endregion
        public 配置设置(用户设置 传入用户设置,时间区间 时间段)
        {
            InitializeComponent();
            设置 = 传入用户设置;
            时间区间 = 时间段;
            //更新硬盘上的设置档案
            设置文件 设置文件 = new 设置文件();
            设置文件.打开设置(传入用户设置,时间段);
            读取配置文件();
            倒计时间.Text = TimeSpan.FromSeconds(0).ToString();
        }
        public void 读取配置文件()
        {
            配置.配置文件位置 = 设置.配置文件路径;
            提醒内容.Text = 设置.闹钟_提醒内容;
            默认刷新间隔.Text = 设置.刷新间隔.ToString();
            后台刷新间隔.Text = 设置.后台刷新间隔.ToString();
            壁纸刷新间隔.Text = 设置.非即时模块刷新间隔.ToString();
            壁纸路径.Text = 设置.壁纸_文件夹路径;
            配置路径.Text = 设置.配置文件路径;
            铃声路径.Text = 设置.闹钟_铃声位置;
            循环文件路径.Text = 设置.铃声文件夹位置;
            提醒时间.Text = DateTime.Now.ToString();
            提醒方式.Text = Enum.GetName(typeof(用户设置.闹钟模式),设置.闹钟_模式);
            if (提醒方式.Text == "关闭") { 提醒方式.Text = "若只需提醒，则无需设置铃声。"; }

            //铃声遍历
            if (Directory.Exists(设置.铃声文件夹位置) == false) { Directory.CreateDirectory(设置.铃声文件夹位置); }
            
            string[] 铃声文件集 = System.IO.Directory.GetFiles(设置.铃声文件夹位置,"*.ogg");
            foreach (string i in 铃声文件集)
            {
                string 曲名 = Path.GetFileName(i).Split(' ')[0];
                if (文件组.Contains(曲名))
                {
                    //若曲名存在，就往后加入这个曲子的完整路径
                    铃声组[文件组.IndexOf(曲名)].铃声文件组+=$"|{i}";
                }
                else
                {
                    铃声信息 信息 = new 铃声信息();
                    信息.铃声文件名 = Path.GetFileName(i);
                    信息.铃声路径 = i;
                    信息.铃声文件组 = i;
                    信息.曲名 = 曲名;
                    文件组.Add(曲名);
                    铃声组.Add(信息);
                }
         
            }
            Console.WriteLine($"已加载{铃声组.Count}个文件");
            //加入选项
            foreach (铃声信息 i in 铃声组)
            {

                铃声.Items.Add(i.曲名);
            }

            //载入已选择铃声
            if(设置.闹钟_铃声组.Count >=2)
            { 
            铃声.SelectedIndex = (铃声.Items.IndexOf(Path.GetFileName(设置.闹钟_铃声组[0]).Split(' ')[0]));

            }
            铃声.Items.Add("不选择铃声（仅提醒）");
            //载入时段划分
            string 时段划分情况 = new 辅助类.配置项().读取(设置.配置文件路径, "显示设置", "时段划分", "时间|0-23");


            时段划分情况 =  时段划分情况.Replace(" ", "\r\n");

            时段划分.Text = 时段划分情况;

            //载入按键
            foreach (var i in Enum.GetValues(typeof(HotkeyModifiers)))
            {
                组合键.Items.Add(i.ToString());
            }
            组合键.SelectedIndex = 组合键.Items.IndexOf(Enum.GetName(typeof(HotkeyModifiers),设置.组合键));
            foreach (var i in Enum.GetValues(typeof(System.Windows.Input.Key)))
            {
                普通键.Items.Add(i.ToString());
            }
            普通键.SelectedIndex = 普通键.Items.IndexOf(Enum.GetName(typeof(System.Windows.Input.Key), 设置.普通键));

        }

        private void 铃声_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (铃声.SelectedValue == "不选择铃声（仅提醒）")
            {
                铃声.SelectedIndex = -1;
            }
            
        }

        private void 确定按钮_Click(object sender, RoutedEventArgs e)
        {
            设置文件 设置文件 = new 设置文件();
            设置文件.打开设置(设置,时间区间);
            设置文件.写入("闹钟设置", "闹钟_下次响铃时间", 提醒时间.Text);
            设置文件.写入("闹钟设置", "闹钟_设定闹钟时间", DateTime.Now.ToString());
            设置文件.写入("闹钟设置", "闹钟_提醒内容", 提醒内容.Text);
            设置文件.写入("闹钟设置", "闹钟_铃声位置", 铃声路径.Text);
            设置文件.写入("性能设置", "刷新间隔", 默认刷新间隔.Text);
            设置文件.写入("性能设置", "后台刷新间隔", 后台刷新间隔.Text);
            设置文件.写入("性能设置", "非即时模块刷新间隔", 壁纸刷新间隔.Text);
            设置文件.写入("壁纸设置", "壁纸_文件夹路径", 壁纸路径.Text);
            设置文件.写入("配置文件路径", "配置文件路径", 配置路径.Text);
            设置文件.写入("显示设置", "时段划分", 时段划分.Text.Replace("\r\n"," "));
            设置文件.写入("显示设置", "组合键", 组合键.SelectedValue.ToString());
            设置文件.写入("显示设置", "普通键", 普通键.SelectedValue.ToString());
            if (DateTime.Parse(提醒时间.Text) > DateTime.Now ){ 设置文件.写入("闹钟设置", "闹钟_模式", "仅提醒"); }
            if (铃声.SelectedIndex != -1)
            {
                设置文件.写入("闹钟设置", "闹钟_铃声组", 铃声组[铃声.SelectedIndex].铃声文件组);

            }
            if (铃声.SelectedIndex == -1)
            {
                设置文件.写入("闹钟设置", "闹钟_铃声组", "");
            }
            // 提醒模式设定器 设置文件.写入("闹钟设置", "闹钟_模式", 提醒内容.Text);
            //铃声组设定器 设置文件.写入("闹钟设置", "闹钟_铃声组", 提醒时间.Text);
            //更新硬盘上的设置档案
            设置文件.打开设置(设置,时间区间);
            this.Close();
        }

        private void 取消按钮_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void 恢复默认值按钮_Click(object sender, RoutedEventArgs e)
        {
            设置文件 设置文件 = new 设置文件();
            设置文件.新建(配置.配置文件位置);
            设置文件.打开设置(设置,时间区间);
            
            this.Close();
        }

        private void 提醒时间_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
      
        }



        private void 倒计时间_LostFocus(object sender, RoutedEventArgs e)
        {
            Console.Write("11");
            DateTime 提醒时间临时储存 = DateTime.Parse(提醒时间.Text);
            TimeSpan 倒计时间临时储存 = TimeSpan.Parse(倒计时间.Text);
            提醒时间.Text = DateTime.Now.Add(倒计时间临时储存).ToString();
        }

        private void 退出程序_Click(object sender, RoutedEventArgs e)
        {
            //退出
            Application.Current.MainWindow.Close();
            Application.Current.Shutdown();
        
            
        }
    }


}
